class Solution {  //滑动窗口 + 哈希表(用数组进行模拟，数据量少，范围且较集中)
public:  
    int totalFruit(vector<int>& fruits) {
    int hash[100001] = {0}, len = 0;  
    for(int left = 0, right = 0, kinds = 0; right < fruits.size(); right++)
    {
        if(hash[fruits[right]] == 0)  kinds++; //kind为窗口内元素的种类
        hash[fruits[right]]++;  //进窗口
        
        while(kinds > 2)  //判断
        {
            hash[fruits[left]]--;  
            if(hash[fruits[left]] == 0) kinds--;  
            left++;  //出窗口
        }
        len = max(len, right - left + 1);  //更新结果
    }
    return len;
    }
};



class Solution {
public:   //滑动窗口+哈希表
    int totalFruit(vector<int>& fruits) {
        unordered_map<int, int> hash; //哈希表
        int len = 0; 
        for(int left = 0, right = 0; right < fruits.size(); right++)
        {
            hash[fruits[right]]++;  //进窗口
            while(hash.size() > 2) //判断 哈希表中的元素个数不超过2
            {
                hash[fruits[left]]--;  //出窗口
                if(hash[fruits[left]] == 0) hash.erase(fruits[left]);  //由原来三种，变到合法的两种
                left++;  
            }
            len = max(len, right - left + 1);  //更新结果
        }
        return len;
    }
};